package us.proyecto.canarios.actions.concursos;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import org.ajax4jsf.exception.FileUploadException;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelectionIndex;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;

import us.proyecto.canarios.actions.admin.AutenticacionAction;
import us.proyecto.canarios.actions.usuarios.ConsultaUsuarioAction;
import us.proyecto.canarios.dao.ConcursoDAO;
import us.proyecto.canarios.dao.DiccionarioDAO;
import us.proyecto.canarios.dao.GruposDAO;
import us.proyecto.canarios.dao.PajarosDAO;
import us.proyecto.canarios.dao.UsuarioDAO;
import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Incidencia;
import us.proyecto.canarios.domain.Pajaro;
import us.proyecto.canarios.domain.Puntuacion;
import us.proyecto.canarios.domain.PuntuacionGrupo;
import us.proyecto.canarios.domain.Tipo;
import us.proyecto.canarios.domain.Usuario;

@Name("gestionGrupoJuez")
@Scope(ScopeType.SESSION)
public class GestionGrupoJuezAction {

	@Logger
	Log log;

	private Pajaro pajaro;
	private Puntuacion puntuacion;
	private Concurso concurso;
	private String filtro;

	@In(create = true)
	private PajarosDAO pajarosDAO;

	private List<PuntuacionGrupo> listaGrupos;
	
	@In(create = true)
	private ConcursoDAO concursoDAO;
	
	@In(create = true)
	private GruposDAO gruposDAO;
	
	private InputStream fich;

	private String filename;
	
	private Boolean consulta = false;
	
	
	public void buscar(){
		if(filtro.equals("1")){
			listaGrupos = pajarosDAO.getListaGruposXConcursoTodos(concurso);
		}else if(filtro.equals("2")) {
			listaGrupos = pajarosDAO.getListaGruposXConcursoSinEvaluar(concurso);
		}else if(filtro.equals("3")) {
			listaGrupos = pajarosDAO.getListaGruposXConcursoEvaluados(concurso);
		}
		for(PuntuacionGrupo p:listaGrupos){
			if(p.getPuntuacion()!=null && !p.getPuntuacion().equals("")) {
				p.setEvaluado("SI");
			}else{
				p.setEvaluado("NO");
			}
			for(Puntuacion pun: p.getPuntuaciones()){
				p.setTipo(pun.getPajaro().getTipo().getNombre());
			}
		}
		
	}
	
	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public String gestion(Concurso con) {
		if(con.getIdConcurso()!=0){
			concurso = con;
			consulta = false;
			concurso = concursoDAO.sincronize(concurso);
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			filtro = "1";
			buscar();
			return "true";
		}
		return "false";

	}
	
	public String gestionPasados(Concurso con) {
		if(con.getIdConcurso()!=0){
			concurso = con;
			consulta = true;
			concurso = concursoDAO.sincronize(concurso);
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			filtro = "1";
			buscar();
			return "true";
		}
		return "false";

	}
	
	public String gestionProximos(Concurso con) {
		if(con.getIdConcurso()!=0){
			concurso = con;
			consulta = true;
			concurso = concursoDAO.sincronize(concurso);
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			filtro = "1";
			buscar();
			return "true";
		}
		return "false";

	}

	public String getFiltro() {
		return filtro;
	}

	public void setFiltro(String filtro) {
		this.filtro = filtro;
	}

	public Pajaro getPajaro() {
		return pajaro;
	}

	public void setPajaro(Pajaro pajaro) {
		this.pajaro = pajaro;
	}

	public List<PuntuacionGrupo> getListaGrupos() {
		return listaGrupos;
	}

	public void setListaGrupos(List<PuntuacionGrupo> listaGrupo) {
		this.listaGrupos = listaGrupo;
	}

	public Concurso getConcurso() {
		return concurso;
	}

	public void setConcurso(Concurso concurso) {
		this.concurso = concurso;
	}

	
	public void cargar() {
        try {
            if (fich != null) {
                String s1 = filename.substring(filename.length() - 3, filename.length());
                if (s1.equals("xls")) {
                        Workbook wb = Workbook.getWorkbook(fich);
                        Sheet sheet = wb.getSheet(0);
                        
                         tratarFicheroGrupo(sheet);
                        
                        
                        
                } else {
                    FacesMessages.instance().add("Debe introducir un fichero excel");
                }
            } else {
                FacesMessages.instance().add("Debe introducir un fichero");
            }
        } catch (BiffException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        } catch (FileUploadException e) {
            FacesMessages.instance().add("El tamaño del archivo es demasiado grande");
        }
    }


	private void tratarFicheroGrupo(Sheet sheet) {
		Cell celdaNumero = sheet.getCell("B1");
		Cell celdaConcurso = sheet.getCell("H1");
		
		PuntuacionGrupo p =pajarosDAO.getPuntuacionGrupoByNumGrupoConcurso(celdaNumero.getContents(), celdaConcurso.getContents());
		for(int i=1;i<5;i++){
			Cell celdaNumAnilla = sheet.getCell(i,1);
			Cell celdaCriterio1 = sheet.getCell(i,2);
			Cell celdaCriterio2 = sheet.getCell(i,3);
			Cell celdaCriterio3 = sheet.getCell(i,4);
			Cell celdaCriterio4 = sheet.getCell(i,5);
			Cell celdaPuntuacion = sheet.getCell(i,6);
			Cell celdaDescalificado = sheet.getCell(i,7);
			Cell celdaObservaciones = sheet.getCell(i,8);
			for(Puntuacion pun:p.getPuntuaciones()){
				if(celdaNumAnilla.getContents()!= null && celdaNumAnilla.getContents().equals(pun.getPajaro().getNumAnilla())){
					pun.setCriterio1(celdaCriterio1.getContents());
					pun.setCriterio2(celdaCriterio2.getContents());
					pun.setCriterio3(celdaCriterio3.getContents());
					pun.setCriterio4(celdaCriterio4.getContents());
					pun.setPuntuacion(celdaPuntuacion.getContents());
					String descalificado = celdaDescalificado.getContents();
					if(descalificado != null && descalificado.equals("S")){
						pun.setDescalificado(true);
					}else {
						pun.setDescalificado(false);
					}
					pun.setMotivo(celdaObservaciones.getContents());
				}
			}
			
		}
		Cell celdaDescalificado = sheet.getCell("B10");
		Cell celdaCriterio1 = sheet.getCell("B11");
		Cell celdaCriterio2 = sheet.getCell("D11");
		Cell celdaCriterio3 = sheet.getCell("B12");
		Cell celdaCriterio4 = sheet.getCell("D12");
		Cell celdaPuntuacion = sheet.getCell("B13");
		//TODO meter el diccionario de datos en las plantillas y terminarlo
		//Cell celdaPremio = sheet.getCell("D13");
		Cell celdaObservaciones = sheet.getCell("B14");
		p.setCriterio1(celdaCriterio1.getContents());
		p.setCriterio2(celdaCriterio2.getContents());
		p.setCriterio3(celdaCriterio3.getContents());
		p.setCriterio4(celdaCriterio4.getContents());
		p.setPuntuacion(celdaPuntuacion.getContents());
		String descalificado = celdaDescalificado.getContents();
		if(descalificado != null && descalificado.equals("S")){
			p.setDescalificado(true);
		}else {
			p.setDescalificado(false);
		}
		p.setMotivo(celdaObservaciones.getContents());
		
		
		gruposDAO.save(p);
	}
	
	public InputStream getFich() {
		return fich;
	}

	public void setFich(InputStream fich) {
		this.fich = fich;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	public Boolean getConsulta() {
		return consulta;
	}

	public void setConsulta(Boolean consulta) {
		this.consulta = consulta;
	}
	
	
	
	
}
